#ifndef MATRIX_H
#define MATRIX_H

#include <stack>
#include <stdio.h>
#include <math.h>

#include "GeoTool_global.h"
#include "vec4.h"
#include <QDebug>


class GEOTOOLSHARED_EXPORT Matrix4
{
    /*******************************************
    /*				Public
    /*******************************************/
    public :

        /********************************************
        /*				Constructors
        /********************************************/

            Matrix4();                          //  Build a new Matrix with default identity values
            Matrix4(float * array);             //  Build a new matrix using float array
            Matrix4(const Matrix4 & copy);

            ~Matrix4();

        /********************************************
        /*          Operator Overload
        /********************************************/

            float   &   operator[](int pos);

            Matrix4 &   operator *  (const Matrix4 & mat );
            vec4    &   operator *  (const vec4 & vec);

            void        operator =  (const Matrix4 & );
            void        operator =  (float * );

        /********************************************
        /*          Get/Set
        /********************************************/

            float   at(int i) const;

        /********************************************
        /*				Methods
        /********************************************/

            /*! @brief  Retourne une copie de la matrice    */
            float * Data() const;

            void    Identity();

            /*!  @brief  Multiply the current matrix by the specified translation    */
            void    Translate(float x, float y, float z);

            /*!  @brief  Multiply the current matrix by the specified Rotation       */
            void    Rotatex(float angle);
            void    Rotatey(float angle);
            void    Rotatez(float angle);
            void    Print();

            void    Push();
            void    Pop();

        /*******************************************
        /*				Properties
        /*******************************************/

        /*******************************************
        /*				Static Methods
        /*******************************************/

            /*  @brief Return the Translation Matrix                */
            static Matrix4 &  Translation  (float x, float y, float z);

            /*  @brief Return the corresponding Rotation matrix     */
            static Matrix4 &  Rotation     (float x, float y, float z);

            /*! @brief Return the perpective Matrix     */
            static Matrix4 &  Perspective(float angle, float ratio, float near, float far);

            /*! @brief Return an Ortho Matrix       */
            static Matrix4 & Ortho(float left, float right, float top, float bot, float near, float far);


    /*******************************************
    /*				Private
    /*******************************************/
    private :

        /*******************************************
        /*				Methods
        /*******************************************/


        /*******************************************
        /*				Properties
        /*******************************************/

            float * m_Datas;

};


#endif // MATRIX_H
